package com.quanxiaoha.weblog.admin.runner;


import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.quanxiaoha.weblog.admin.constant.RedisKeyConstants;
import com.quanxiaoha.weblog.common.utils.JsonUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;


@Component
@Slf4j
public class PushRolePermissions2RedisRunner implements ApplicationRunner {

    @Resource
    private RedisTemplate<String, String> redisTemplate;


    // 权限同步标记 Key
    private static final String PUSH_ROLE_FLAG = "push.role.flag";

    @Override
    public void run(ApplicationArguments args) {
        log.info("==> 服务启动，开始同步角色权限数据到 Redis 中...");

        try {
            // 是否能够同步数据: 原子操作，只有在键 PUSH_PERMISSION_FLAG 不存在时，才会设置该键的值为 "1"，并设置过期时间为 1 天
            boolean canPushed = redisTemplate.opsForValue().setIfAbsent(PUSH_ROLE_FLAG, "1", 1, TimeUnit.DAYS);

            // 如果无法同步权限数据
            if (!canPushed) {
                log.warn("==> 角色权限数据已经同步至 Redis 中，不再同步...");
                return;
            }

            // 查询出所有角色
            Map<String, List<String>> roles = new HashMap<>();

            List<String> roleAdmin = new ArrayList<>();
            roleAdmin.add("ROLE_ADMIN");
            List<String> roleTest = new ArrayList<>();
            roleTest.add("ROLE_VISITOR");
            roles.put("admin", roleAdmin);
            roles.put("test", roleTest);

            for (Map.Entry<String, List<String>> entry : roles.entrySet()) {
                String roleId = entry.getKey();
                List<String> rolesList = entry.getValue();

                // 构建 Redis Key
                String redisKey = RedisKeyConstants.buildUserRolesKey(roleId);



                // 保存到 Redis 中
                redisTemplate.opsForValue().set(redisKey, JsonUtil.toJsonString(rolesList));
            }



            log.info("==> 服务启动，成功同步角色权限数据到 Redis 中...");
        } catch (Exception e) {
            log.error("==> 同步角色权限数据到 Redis 中失败: ", e);
        }

    }
}

